# -*- coding: utf-8 -*-

"""
  @author: tangliqi
  @date: 2023/2/10 10:00
  @python version: 3.6 
  @contact me: 110
  ---------------------------------------
  @desc: python设计模式实现 => 备忘录模式.py
"""
from abc import abstractmethod


# 通过一个游戏存档的例子来说明。
# 游戏中，可以设置多个存档。
# 想恢复到哪个存档点，选择该存档点，进行读取即可。
# 备忘录模式的构成： 1.备忘录（存档） 2.发起者(玩家发起存档请求) 3.管理者（记录所有存档的界面）

# ============================  备忘录类（存档内容）  ============================
class Archive:
    """
    备忘录角色，只用来存储存档（保证封装原则），不能修改存档
    """

    def __init__(self, level, role):
        self.level = level  # 关卡信息
        self.role = role  # 角色信息

    # 获取存档信息
    def get_state(self):
        return self.level, self.role


# ============================  管理者类（记录所有存档的界面）  ============================
class Creator:
    """
    管理者角色
    负责存储所有的存档，不能对存档的内容进行操作和访问，只能够将存档传递
    """

    def __init__(self):
        self.archive_list = list()

    # 添加一个存档
    def add_archive(self, archive: Archive):
        return self.archive_list.append(archive)

    # 获取某个存档记录
    def get_archive(self, index):
        return self.archive_list[index]


# ============================  发起者类（发起存档请求）  ============================
class Player:
    def __init__(self):
        """玩家当前的状态,默认在1，1"""
        self.level = 1
        self.role = 1

    def set_player_state(self, level, role):
        self.level = level
        self.role = role

    # 发起存档请求
    def create_archive(self):
        return Archive(self.level, self.role)

    # 恢复到某个存档
    def restore_archive(self, archive: Archive):
        self.level, self.role = archive.get_state()

    # 获取当前进度
    def state(self):
        print(f"玩家当前进度：关卡位置 -> {self.level};玩家等级 -> {self.role};")


if __name__ == '__main__':
    # 生成存档管理者
    creator = Creator()

    # 刚开始游戏
    player = Player()
    player.state()

    # 进行一段时间后升级了
    player.set_player_state(4, 3)
    player.state()

    # 保存存档
    archive1 = player.create_archive()
    creator.add_archive(archive1)

    # 又玩了一段时间
    player.set_player_state(10, 10)
    archive2 = player.create_archive()
    creator.add_archive(archive2)

    # 恢复为以前的存档
    player.state()
    archive_pre = creator.get_archive(0)
    player.restore_archive(archive_pre)
    player.state()
